嗨~大家好啊,今天是鐵人賽的倒數第二天,我又開心又興奮,終於快要結束這艱辛的30天。昨天我們說了紀錄的一些工具與簡單的使用後,今天要來練習如何把我們的專案包成一個Image 提供給別人使用!
今天主要是針對ASP.NET Core 的專案使用Dockerfile 來包成Image,所以docker 的用途在今天就不會多做介紹,那我們就開始今天的主題~
在這裡我們預先會使用到微軟提供的兩個Image 分別為dotnet/sdk
和dotnet/aspnet
dotnet/sdk
範例會使用此映像來建置應用程式。 映射包含 .NET SDK,其中包含命令列工具 (CLI) 。 此映像會最佳化來進行本機開發、偵錯和單元測試。 安裝用於開發和編譯的工具會使映射變得相對大
dotnet/aspnet
範例會使用此映像來執行應用程式。 此映像包含 ASP.NET Core 執行階段和程式庫,並會進行最佳化,以在生產環境中執行應用程式。 專為部署和應用程式啟動速度而設計的映像相對較小,因此,已將從 Docker 登錄到 Docker 主機的網路效能最佳化。 只會將執行應用程式所需的程式庫和內容複製到容器中。 內容已準備好執行,可用最短的時間從 docker run 到應用程式啟動。 在 Docker 模型中,不需要動態程式碼編譯
若有需要可以到官網提供的Github 來看看其他image的功能與用途 Github_link
如今我們要將專案部屬到容器實,我們為了要節省專案的空間,我們會透過下列的方式來幾單的啟動我們的服務
dotnet publish -c Release -o published
執行完此指令會我們會產生一個新的published 的資料夾,在這資料的東西就能幫我們快速的啟動專案,而且此指令不單純只有run 而已還會有偵錯的模式
dotnet publish\<projectName>.dll
接著我們照這指令就可以啟動我們的專案
這樣的方式可以簡單的啟用我們的專案,所以在部屬實就會用它來幫我們起服務
這個Dockerfile 起起來後就可以開啟我們做的專案,細節的部份我有寫在裡面
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /dotnet
# 透過restore 把相關的NuGet套件安裝下來
COPY <projectName>/*.csproj ./<projectName>/
RUN dotnet restore
# 這裡就是上方剛才介紹的功能
COPY <projectName>/. ./<projectName>/
WORKDIR /dotnet/<projectName>
RUN dotnet publish -c release -o /app --no-restore
# 最後在aspnet 的image 把專案開起來
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "<projectName>.dll"]
先透過我們的Dockerfile 創Image
docker build -t dotnet --no-cache .
使用剛才的Image 來起我們的Container
docker run -it --rm -p 5000:5000 -i dotnet
最後要是沒出甚麼意外的話我們的專案應該就可以拿來用,要是你開專案實沒看到Swagger 的話是正常的,要改的地方會再Program.cs
裡的這段
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
這裡由於在開發環境下才會使用Swagger,所以你不想要這樣就把這判斷是除掉,再重部屬Image就會看到Swagger了
那今天介紹了要怎麼把我們的專案部屬Docker 上,這樣的方式可以快速又簡單的啟用我們的服務,這樣的方式對工程師來說根本家常便飯,希望大家會喜歡今天的鐵人賽,我們就最後一天見啦~~~